package com.pagseguro
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
    import flash.net.navigateToURL;
    
    import mx.collections.ArrayCollection;
    import mx.formatters.NumberFormatter;



    [Bindable]
    public class Carrinho extends EventDispatcher
    {
        private const url:String = 'https://pagseguro.uol.com.br/security/webpagamentos/webpagto.aspx';
        [Inspectable(category="General",enumeration="SD,EN")]
        public var tipo_frete:String = FreteTipo.PAC;
        [ArrayElementType("com.pagseguro.Produto")]
        [Inspectable(arrayType="com.pagseguro.Produto")]
        private var lista:ArrayCollection = new ArrayCollection();
        private var totalCompra:int = 0;

        [Bindable(event='listaChanged')]
        public function get getLista():ArrayCollection
        {
            return lista;
        }

        [Bindable(event='listaChanged')]
        public function get getTotalCompra():Number
        {
            return totalCompra / 100;
        }

        [Bindable(event='listaChanged')]
        public function get getTotalCompraString():String
        {
            var tmp:Number = totalCompra / 100;
            var format:NumberFormatter = new NumberFormatter()
            format.thousandsSeparatorTo = '.'
            format.decimalSeparatorTo = ','
            format.precision = 2
            return "R$ " + format.format(totalCompra / 100);
        }
        /**
         * Codificaçaõ dos dados que são enviado ao PagSeguro. 
         * Não mude para evitar problema de acento
         */
        public const encoding:String = 'utf-8'

        /**
         * construtor
         * passe o e-mail cadastrado no PagSeguro
         */
        public function Carrinho()
        {
        }

        /**
         * Adiciona um novo Produto
         */
        public function addProduto(_produto:Produto):void
        {
            // analiza todos os itens para saber se o item já esta na lista
            for (var i:int = 0; i < lista.length; i++)
            {
                // Verifica se  os item_id são iguais
                if ((lista[i] as Produto).item_id == _produto.item_id)
                {
                    // Se forem iguais, soma mais um item as quantidades e sai da função 
                    (lista[i] as Produto).item_quant += _produto.item_quant;
                    // antes de sair atualiza a lista
                    atualizaTotal()
                    return;
                }
            }
            // Neste ponto só chega se o produto não for encontrado acima.
            lista.addItem(_produto);
            // antes de sair atualiza a lista
            atualizaTotal()
        }

        /**
         * Adiciona um novo Produto sem a instância da classe Produto
         *
         * O Preço é passado numérico (ponto Flutuante), porém o PagSeguro necessita que ele seja
         * enviado no formato INT diferente de zero.
         * Em caso de desconto deverá ser informado este valor negativo
         */
        public function addItem(item_id:uint, item_descr:String, item_quant:uint, item_valor:Number, peso:Number = 0):void
        {
            var _produto:Produto = new Produto
            _produto.item_id = item_id
            _produto.item_descr = item_descr
            _produto.item_quant = item_quant
            // Multiplicado por 100, para retirar o ponto Flutuante
            _produto.item_valor = item_valor * 100
            _produto.peso = peso
            this.addProduto(_produto)
        }

        /**
         * Informar desconto em reais.
         *
         * Não passar negativo
         *
         * -- Ainda não há sistema de desconto em porcentagem --
         */
        public function addDesconto(item_valor:Number, item_descr:String = 'Desconto', item_id:uint = 0):void
        {
            var _produto:Produto = new Produto
            _produto.item_id = item_id
            _produto.item_descr = item_descr
            _produto.item_quant = 1
            // 
            _produto.item_valor = item_valor * (-100)
            this.addProduto(_produto)
        }

        private function atualizaTotal():void
        {
            totalCompra = 0;
            for (var i:int = 0; i < lista.length; i++)
            {
                totalCompra += (lista[i] as Produto).item_quant * (lista[i] as Produto).item_valor
            }
            dispatchEvent(new Event("listaChanged"));
        }

        /**
         * Limpa o carrinho de compras
         */
        public function limpar():void
        {
            // limpa a lista de produtos
            lista = new ArrayCollection()
            atualizaTotal()
        }

        public function fecharPedido(email_cobranca:String, cliente:Cliente):void
        {
            var variaveis:URLVariables = new URLVariables()
            variaveis.email_cobranca = email_cobranca
            variaveis.tipo = 'CP'
            variaveis.moeda = 'BRL'
            variaveis.encoding = 'utf-8'
            variaveis.tipo_frete = tipo_frete
            variaveis.cliente_nome = cliente.cliente_nome
            variaveis.cliente_cep = cliente.cliente_cep
            variaveis.cliente_end = cliente.cliente_end
            variaveis.cliente_num = cliente.cliente_num
            variaveis.cliente_compl = cliente.cliente_compl
            variaveis.cliente_bairro = cliente.cliente_bairro
            variaveis.cliente_cidade = cliente.cliente_cidade
            variaveis.cliente_uf = cliente.cliente_uf
            variaveis.cliente_pais = cliente.cliente_pais
            variaveis.cliente_ddd = cliente.cliente_ddd
            variaveis.cliente_tel = cliente.cliente_tel
            variaveis.cliente_email = cliente.cliente_email
            
            for (var i:int = 0; i < lista.length; i++)
            {
                variaveis.decode('item_id_' + (i + 1) + "=" + (lista[i] as Produto).item_id)
                variaveis.decode('item_descr_' + (i + 1) + "=" + (lista[i] as Produto).item_descr)
                variaveis.decode('item_quant_' + (i + 1) + "=" + (lista[i] as Produto).item_quant)
                variaveis.decode('item_valor_' + (i + 1) + "=" + (lista[i] as Produto).item_valor)
                variaveis.decode('peso_' + (i + 1) + "=" + (lista[i] as Produto).peso)
            }
            var request:URLRequest = new URLRequest(url)
            request.data = variaveis
            request.method = 'POST'
            navigateToURL(request, '_blank')
        }
    }
}